package com.knowledge.business.service;

import com.knowledge.business.domain.TCp;
import com.openai.client.OpenAIClient;
import com.openai.client.OpenAIClientAsync;
import com.openai.client.okhttp.OpenAIOkHttpClient;
import com.openai.client.okhttp.OpenAIOkHttpClientAsync;
import com.openai.models.chat.completions.ChatCompletion;
import com.openai.models.chat.completions.ChatCompletionCreateParams;
import opennlp.tools.util.StringUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.CompletableFuture;

@Service
public class OpenAiService {


    public String getChatReply(String documentContent) {
        if (StringUtil.isEmpty(documentContent)) {
            return "";
        }
        String content = "";
        OpenAIClient client = OpenAIOkHttpClient.builder()
                // 若没有配置环境变量，请用阿里云百炼API Key将下行替换为.apiKey("sk-xxx")
                // 新加坡和北京地域的API Key不同。获取API Key：https://help.aliyun.com/zh/model-studio/get-api-key
                .apiKey("sk-45d255ee5ceb4e8c95d792d1260a51ba")
                // 以下是北京地域base_url，如果使用新加坡地域的模型，需要将base_url替换为：https://dashscope-intl.aliyuncs.com/compatible-mode/v1
                .baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1")
                .build();
        ChatCompletionCreateParams params = ChatCompletionCreateParams.builder()
                .model("qwen-flash")
                .addSystemMessage("这是用户的问题中被问的产品以及对应的数量，请给与100字的建议，比如备货建议等")
                .addUserMessage(documentContent)
                .build();
        try {
            ChatCompletion chatCompletion = client.chat().completions().create(params);
            content = chatCompletion.choices().get(0).message().content().orElse("");
            System.out.println("大模型返回的数据：" + content);
            return content;
        } catch (Exception e) {
            System.err.println("错误信息：" + e.getMessage());
        }

        return content;
    }


    // 补充建议
    public String getBcChatReply(String documentContent) {
        if (StringUtil.isEmpty(documentContent)) {
            return "";
        }
        String content = "";
        OpenAIClient client = OpenAIOkHttpClient.builder()
                // 若没有配置环境变量，请用阿里云百炼API Key将下行替换为.apiKey("sk-xxx")
                // 新加坡和北京地域的API Key不同。获取API Key：https://help.aliyun.com/zh/model-studio/get-api-key
                .apiKey("sk-45d255ee5ceb4e8c95d792d1260a51ba")
                // 以下是北京地域base_url，如果使用新加坡地域的模型，需要将base_url替换为：https://dashscope-intl.aliyuncs.com/compatible-mode/v1
                .baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1")
                .build();
        ChatCompletionCreateParams params = ChatCompletionCreateParams.builder()
                .model("qwen-flash")
                .addSystemMessage("这是用户的问题中，本地知识库中没有维护关于该问题的知识，请给出100字的针对该问题的知识")
                .addUserMessage(documentContent)
                .build();
        try {
            ChatCompletion chatCompletion = client.chat().completions().create(params);
            content = chatCompletion.choices().get(0).message().content().orElse("");
            System.out.println("大模型返回的数据：" + content);
            return content;
        } catch (Exception e) {
            System.err.println("错误信息：" + e.getMessage());
        }

        return content;
    }


    public String getChatCpReply(String documentContent) {
        if (StringUtil.isEmpty(documentContent)) {
            return "";
        }
        String content = "";
        OpenAIClient client = OpenAIOkHttpClient.builder()
                // 若没有配置环境变量，请用阿里云百炼API Key将下行替换为.apiKey("sk-xxx")
                // 新加坡和北京地域的API Key不同。获取API Key：https://help.aliyun.com/zh/model-studio/get-api-key
                .apiKey("sk-45d255ee5ceb4e8c95d792d1260a51ba")
                // 以下是北京地域base_url，如果使用新加坡地域的模型，需要将base_url替换为：https://dashscope-intl.aliyuncs.com/compatible-mode/v1
                .baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1")
                .build();
        ChatCompletionCreateParams params = ChatCompletionCreateParams.builder()
                .model("qwen-flash")
                .addSystemMessage("请帮我提取文档中的全部产品名称清单，把每个产品名称输出就可以了，不要包含特殊字符，每个产品名称之间用$号连接,如果没有产品信息，请返回一个固定文字'未获取到产品名称'")
                .addUserMessage(documentContent)
                .build();
        try {
            ChatCompletion chatCompletion = client.chat().completions().create(params);
            content = chatCompletion.choices().get(0).message().content().orElse("");
            System.out.println("大模型返回的数据：" + content);
            // 对返回结果进行后处理，过滤掉单字符关键词

            return content;
        } catch (Exception e) {
            System.err.println("错误信息：" + e.getMessage());
        }

        return content;
    }

    public String getChatCpReplyQu(String documentContent) {
        if (StringUtil.isEmpty(documentContent)) {
            return "";
        }
        String content = "";
        OpenAIClient client = OpenAIOkHttpClient.builder()
                // 若没有配置环境变量，请用阿里云百炼API Key将下行替换为.apiKey("sk-xxx")
                // 新加坡和北京地域的API Key不同。获取API Key：https://help.aliyun.com/zh/model-studio/get-api-key
                .apiKey("sk-45d255ee5ceb4e8c95d792d1260a51ba")
                // 以下是北京地域base_url，如果使用新加坡地域的模型，需要将base_url替换为：https://dashscope-intl.aliyuncs.com/compatible-mode/v1
                .baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1")
                .build();
        ChatCompletionCreateParams params = ChatCompletionCreateParams.builder()
                .model("qwen-flash")
                .addUserMessage(documentContent)
                .addSystemMessage("请从用户问题中提取产品名称。产品是广义概念，包括：实物商品（手机、服装）、服务套餐（会员服务）、餐饮菜品（宫保鸡丁）、课程项目（Python课）等。要求：1.只返回产品名称，用$连接；2.不含标点符号；3.无产品则返回'未获取到产品名称'。示例：'苹果手机怎么样'→'苹果手机'")
                //.addSystemMessage("请从用户的问题中提取出具体的产品名称或商品名称或菜名。产品名称应该是具体的商品，如'手机'、'耳机'、'笔记本电脑'等。将提取到的产品名称用$符号连接，不要包含任何标点符号，只返回产品名称。如果没有识别到具体产品，请返回'未获取到产品名称'")
                .build();
        try {
            ChatCompletion chatCompletion = client.chat().completions().create(params);
            content = chatCompletion.choices().get(0).message().content().orElse("");
            System.out.println("大模型返回的数据11：" + content);
            if ("未获取到产品名称".equals(content)) {
                return content;
            }
            if (!"未获取到产品名称".equals(content) && !content.contains("$")) {
                return String.join("$", content);
            }
            if (!"未获取到产品名称".equals(content) && content.contains("$")) {
                String[] keywords = content.split("\\$");
                List<String> validKeywords = new ArrayList<>();
                for (String keyword : keywords) {
                    if (keyword.length() >= 2) {
                        validKeywords.add(keyword);
                    }
                }
                if (validKeywords.isEmpty()) {
                    return "未获取到产品名称";
                }
                return String.join("$", validKeywords);
            }
            return "未获取到产品名称";
        } catch (Exception e) {
            System.err.println("错误信息：" + e.getMessage());
        }

        return content;
    }


    /**
     * 关键词提取
     */
    public String getGjcChatCpReply(String documentContent) {
        if (StringUtil.isEmpty(documentContent)) {
            return "";
        }
        String content = "";
        OpenAIClient client = OpenAIOkHttpClient.builder()
                // 若没有配置环境变量，请用阿里云百炼API Key将下行替换为.apiKey("sk-xxx")
                // 新加坡和北京地域的API Key不同。获取API Key：https://help.aliyun.com/zh/model-studio/get-api-key
                .apiKey("sk-45d255ee5ceb4e8c95d792d1260a51ba")
                // 以下是北京地域base_url，如果使用新加坡地域的模型，需要将base_url替换为：https://dashscope-intl.aliyuncs.com/compatible-mode/v1
                .baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1")
                .build();
        ChatCompletionCreateParams params = ChatCompletionCreateParams.builder()
                .model("qwen-flash")
                .addSystemMessage("请帮我提取用户问题中的关键词，关键词应该是有意义的词语而非单字。将提取的关键词用$符号连接，不要包含任何标点符号，只返回关键词内容。例如：用户问题'我想买苹果手机'，应该返回'苹果$手机'。如果没有符合要求的关键词，返回'没有关键词'")
                .addUserMessage(documentContent)
                .build();
        try {
            ChatCompletion chatCompletion = client.chat().completions().create(params);
            content = chatCompletion.choices().get(0).message().content().orElse("");
            System.out.println("大模型返回的数据：" + content);
            if (!"没有关键词".equals(content) && content.contains("$")) {
                String[] keywords = content.split("\\$");
                List<String> validKeywords = new ArrayList<>();
                for (String keyword : keywords) {
                    if (keyword.length() >= 2) {
                        validKeywords.add(keyword);
                    }
                }
                if (validKeywords.isEmpty()) {
                    return "没有关键词";
                }
                return String.join("$", validKeywords);
            }
            return content;
        } catch (Exception e) {
            System.err.println("错误信息：" + e.getMessage());
        }

        return content;
    }


    public String getImage(String documentContent) {
        if (StringUtil.isEmpty(documentContent)) {
            return "";
        }
        String content = "";
        OpenAIClient client = OpenAIOkHttpClient.builder()
                // 若没有配置环境变量，请用阿里云百炼API Key将下行替换为.apiKey("sk-xxx")
                // 新加坡和北京地域的API Key不同。获取API Key：https://help.aliyun.com/zh/model-studio/get-api-key
                .apiKey("sk-45d255ee5ceb4e8c95d792d1260a51ba")
                // 以下是北京地域base_url，如果使用新加坡地域的模型，需要将base_url替换为：https://dashscope-intl.aliyuncs.com/compatible-mode/v1
                .baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1")
                .build();
        ChatCompletionCreateParams params = ChatCompletionCreateParams.builder()
                .model("qwen-flash")
                .addSystemMessage("根据用户的问题回答'")
                .addUserMessage(documentContent)
                .build();
        try {
            ChatCompletion chatCompletion = client.chat().completions().create(params);
            content = chatCompletion.choices().get(0).message().content().orElse("");
            System.out.println("大模型返回的数据：" + content);
            if (!"没有关键词".equals(content) && content.contains("$")) {
                String[] keywords = content.split("\\$");
                List<String> validKeywords = new ArrayList<>();
                for (String keyword : keywords) {
                    if (keyword.length() >= 2) {
                        validKeywords.add(keyword);
                    }
                }
                if (validKeywords.isEmpty()) {
                    return "没有关键词";
                }
                return String.join("$", validKeywords);
            }
            return content;
        } catch (Exception e) {
            System.err.println("错误信息：" + e.getMessage());
        }

        return content;
    }


    public static void main(String[] args) {
        OpenAiService openAiService = new OpenAiService();
        String content = "待机时上传图片\n" +
                "\n" +
                "![d65ca2052a67a6e010a58ee3620547ed.jpeg](http://aisheart-test.oss-cn-beijing.aliyuncs.com/1992156882576420866/1992533442803036162/be1b05ea-d436-4149-9263-82b9e350f6b0.png)  ,待机时的图片是什么";
        String chatReply = openAiService.getImage(
                content);
        System.out.println(chatReply);

    }


}
